package com.yhny.lykj.yuhannongye.tools;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;

import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.longsichao.lscframe.net.NetworkHelper;
import com.yhny.lykj.yuhannongye.MyApplication;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import jp.wasabeef.picasso.transformations.internal.Utils;

/**
 * Created by lc on 2016/4/1.
 */
public final class Tools {

    /**
     2  * 获取版本号
     3  * @return 当前应用的版本号
     4  */
    public static String getVersion() {
        try {
            PackageManager manager = MyApplication.getContext().getPackageManager();
            PackageInfo info = manager.getPackageInfo(MyApplication.getContext().getPackageName(), 0);
            String version = info.versionName;
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return "1.0";
        }
    }

    /**
     * 验证中国手机号码
     * 可以验证的格式：
     * <li>13812345678</li>
     * <li>8613812345678</li>
     * <li>+8613812345678</li>
     *
     * @param number 手机号码
     * @return {@code true}验证成功
     */
    public static boolean isMobilePhoneNumber(String number) {
        if (TextUtils.isEmpty(number)) {
            return false;
        }
        String numberString = number;
        if (numberString.startsWith("86")) {
            numberString = numberString.substring(2);
        }
        if (numberString.startsWith("+86")) {
            numberString = numberString.substring(3);
        }
        return numberString.matches("^1(3|4|5|7|8)[0-9]{9}$");
    }
    /**
     * 验证邮箱地址
     *
     * @param email 邮箱地址
     * @return {@code true}验证成功
     */
    public static boolean isEmailAddress(String email) {
        return !TextUtils.isEmpty(email) && email.matches("^([a-z0-9A-Z\\+\\-\\|_\\.]+)@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$");
    }
    /**
     * 验证18位身份证号码
     * 验证依据：GB11643-1999
     *
     * @param idString 18位身份证号码
     * @return {@code true}验证成功
     */
    public static boolean isIdNumber(String idString) {
        if (TextUtils.isEmpty(idString) || idString.length() != 18) {
            return false;
        }

        // 将可能存在的X转换成大写
        String id = idString.toUpperCase();

        // 匹配示例：
        // 北京市朝阳区1949年12月31日出生的一女性公民：11010519491231002X
        // 广东省汕头市潮阳县1880年1月1日出生的一男性公民：440524188001010014
        // 正则表达式解析：
        // [1-9]                      第1位数字取值1-9
        // [0-9]{5}                   第2-6位数字取值0-9
        // (18|19|20)                 第7-8位数字取值1-2，年份的前两位，年份取值范围：1800-2099
        // [0-9]{2}                   第9-10位数字取值0-9，年份的后两位
        // (01|03|05|07|08|10|12)     第11-12位数字为月份，31天月份匹配
        // (0[1-9]|[1-2][0-9]|3[0-1]) 第13-14位数字为日，31天月份匹配
        // (04|06|09|11)              第11-12位数字为月，30天月份匹配
        // (0[1-9]|[1-2][0-9]|30)     第13-14位数字为日，30天月份匹配
        // 02                         第11-12位数字为月，2月份匹配
        // (0[1-9]|[1-2][0-9])        第13-14位数字为日，2月份匹配，按照闰年29天匹配
        // [0-9]{3}                   第15-17位数字取值0-9
        // [0-9X]                     第18位数字取值0-9以及可能出现的X
        if (!id.matches("^[1-9][0-9]{5}(18|19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9X]$")) {
            return false;
        }

        // 判断日期，如果身份证日期大于当前日期则验证失败，这里只需要判断年份即可
        int currentYear = Calendar.getInstance().get(Calendar.YEAR);
        int idYear = Integer.parseInt(id.substring(6, 10));
        if (idYear > currentYear) {
            return false;
        }

        // 当不为闰年的时候检查日期不能大于28天
        int idMonth = Integer.parseInt(id.substring(10, 12));
        if (idMonth == 2) {
            if (!((idYear % 4 == 0 && idYear % 100 != 0) || idYear % 400 == 0)) {
                int idDay = Integer.parseInt(id.substring(12, 14));
                if (idDay > 28) {
                    return false;
                }
            }
        }

        // 验证第18位校验码
        int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        char[] validate = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += Integer.parseInt(String.valueOf(id.charAt(i))) * weight[i];
        }
        int mode = sum % 11;
        return validate[mode] == id.charAt(17);
    }
    public static boolean checkNetForImage() {
        return NetworkHelper.isWirelessAvailable() || (NetworkHelper.isCellularAvailable() );
    }
    public static String checkDate(String fullDate) {
        if (fullDate == null || fullDate.isEmpty()) {
            return "";
        }
        String[] split = fullDate.split(" ");
        return split[0];
    }

    /**
     * 判断字符串是否为空
     * @param str
     * @return 为空则为 true  不为空则为 false
     */
    public static Boolean isCheckString(String str){
        if (str == null || str.isEmpty()) {
            return true;
        }
        return false;
    }

    /**
     * 检查字符串是否为NULL
     * @param str 检验字符串
     * @return 空则返回"" 不为空则返回内容
     */
    public static String checkString(String str) {
        if (str == null || str.isEmpty()) {
            return "";
        }
        return str;
    }

    /**
     * 将字符串转成MD5值
     *
     * @param string
     * @return
     */
    public static String stringToMD5(String string) {
        byte[] hash;

        try {
            hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10)
                hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }

        return hex.toString();
    }

    /**
     * 文件加密
     * @param imageUri
     * @return
     */
    public String generate(String imageUri) {
        byte[] md5 = this.getMD5(imageUri.getBytes());
        BigInteger bi = (new BigInteger(md5)).abs();
        return bi.toString(36);
    }

    /**
     *
     * @param data
     * @return
     */
    private byte[] getMD5(byte[] data) {
        byte[] hash = null;

        try {
            MessageDigest e = MessageDigest.getInstance("MD5");
            e.update(data);
            hash = e.digest();
        } catch (NoSuchAlgorithmException var4) {
            LCLog.e(var4.toString());
        }

        return hash;
    }

    /**
     * 数字转为 XX万
     * @param str
     * @return
     */
    public static String strFormat(String str){
        String tempStr = "";
        if(isCheckString(str)){
            return "0";
        }
        int num = Integer.parseInt(str);
        if (num>10000){
            int temp = num%10000;
            tempStr = temp+"万";
        }else {
            tempStr = str;
        }
        return tempStr;
    }

    private static DecimalFormat fnum = new DecimalFormat("##0.0");
    /**
     * 计算距离
     * @param str
     * @return
     */
    public static String strToKm(String str){
        long m = 0;
        if(isCheckString(str)){
            return "0";
        }
        LCLog.e("str = "+str+";");

        m = (long)Double.parseDouble(str.trim());

        if (m < 1000) {
            return m + "m";
        }
        float dis = m / 1000f;
        String disDes = fnum.format(dis) + "km";
        return disDes;
    }

    /**
     * 判断是否为非法的json
     * @param json
     * @return true 合法 false 非法
     */
    public static boolean isGoodJson(String json) {

        try {
            new JsonParser().parse(json);
            return true;
        } catch (JsonParseException e) {
            System.out.println("bad json: " + json);
            return false;
        }
    }



    /**
     * 截取html中的图片地址
     * @param htmlStr
     * @return
     */
    public static ArrayList<String> htmlToString(String htmlStr){
        if (htmlStr==null||htmlStr.isEmpty()){
            return new ArrayList<String>();
        }
        String img = "";
        Pattern p_image;
        Matcher m_image;
        ArrayList<String> pics = new ArrayList();
        Pattern p = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)");
        Matcher m = p.matcher(htmlStr);
        while(m.find()){
            pics.add(m.group(1));
        }
        return pics;
    }

    /**
     * 截取<img ...  >中间字符串
     * @param htmlStr
     * @return
     */
    public static ArrayList<String> htmlToImg(String htmlStr){
        if (htmlStr==null||htmlStr.isEmpty()){
            return new ArrayList<String>();
        }
        ArrayList<String> pics = new ArrayList();
        Pattern p = Pattern.compile("(<img[^>]*>)");
        Matcher m = p.matcher(htmlStr);
        while(m.find()){
            pics.add(m.group(1));
        }
        return pics;
    }


    /**
     * 去掉img标签
     * @param htmlStr
     * @return
     */
    public static String clearImageHtml(String htmlStr){
        ArrayList<String> imageArray = htmlToImg(htmlStr);
        String str = htmlStr;
        for (String image:imageArray){
            str = str.replace(image," ");
            str =str.replaceAll("<br />","");
        }

        return str;

    }
    /*
     * 计算两点之间距离
     *
     * @param start
     *
     * @param end
     *
     * @return 米
     */
    public static double getDistance(double startLong, double  startLat,String endLong,String endLat)
    {
        if (TextUtils.isEmpty(endLong)||TextUtils.isEmpty(endLat)){
            return 0;
        }
        double lon = Double.parseDouble(endLong.trim());
        double lat = Double.parseDouble(endLat.trim());
        double lon1 = (Math.PI / 180) * startLong;
        double lon2 = (Math.PI / 180) * lon;
        double lat1 = (Math.PI / 180) * startLat;
        double lat2 = (Math.PI / 180) * lat;

        // double Lat1r = (Math.PI/180)*(gp1.getLatitudeE6()/1E6);
        // double Lat2r = (Math.PI/180)*(gp2.getLatitudeE6()/1E6);
        // double Lon1r = (Math.PI/180)*(gp1.getLongitudeE6()/1E6);
        // double Lon2r = (Math.PI/180)*(gp2.getLongitudeE6()/1E6);

        // 地球半径
        double R = 6371;

        // 两点间距离 km，如果想要米的话，结果*1000就可以了
        double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;

        return d * 1000;
    }


    /**
     * 标签转义
     * @param str
     * @return
     */
    public static String HtmlToString(String str){
        if (TextUtils.isEmpty(str)){
            return "";
        }

        String context = str.replace("\\","");
        context = context.replaceAll("&amp;", "");
        context = context.replaceAll("&quot;", "\"");
        context = context.replaceAll("&lt;", "<");
        context = context.replaceAll("&gt;", ">");
        context = context.replaceAll("&nbsp;", " ");
        context = context.replaceAll("nbsp;", " ");
        context = context.replaceAll("rdquo;", " ");
        context = context.replaceAll("ldquo;", " ");
        context.replaceAll("<img", "<img height=\"auto\"; width=\"100%\"");
        return context;
    }

    /**
     * 标签转义 无图片
     * @param str
     * @return
     */
    public static String HtmlToStr(String str){
        Spanned text;
        if (TextUtils.isEmpty(str)){
            return "";
        }
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            text = Html.fromHtml(str,Html.FROM_HTML_MODE_LEGACY);
        } else {
            text = Html.fromHtml(str);
        }
        return text.toString();
    }


    /**
     * 判断是否为数字和字母组成
     * @param str
     * @return
     */
    public static boolean isLetterDigit(String str){
        boolean isDigit = false;//定义一个boolean值，用来表示是否包含数字
        boolean isLetter = false;//定义一个boolean值，用来表示是否包含字母
        for(int i=0 ; i<str.length();i++){
        if(Character.isDigit(str.charAt(i))){     //用char包装类中的判断数字的方法判断每一个字符
            isDigit = true;
        }

        if(Character.isLetter(str.charAt(i))){   //用char包装类中的判断字母的方法判断每一个字符
            isLetter = true;
        }
    }
    String regex = "^[a-zA-Z0-9]+$";
    boolean isRight = isDigit && isLetter&&str.matches(regex);
  return isRight;

}

}
